gusucode.com > VC++ 车牌识别源代码-源码程序 > VC++ 车牌识别源代码-源码程序/code/Plate/PlateLocateView.cpp
//Download by http://www.NewXing.com // PlateLocateView.cpp : implementation of the CPlateLocateView class // #include "stdafx.h" #include "PlateLocate.h" #include "MainFrm.h" #include "DlgIntensity.h" #include "PlateLocateDoc.h" #include "PlateLocateView.h" #include "PlateLocateMethod.h" #include "ColorTable.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView IMPLEMENT_DYNCREATE(CPlateLocateView, CView) BEGIN_MESSAGE_MAP(CPlateLocateView, CView) //{{AFX_MSG_MAP(CPlateLocateView) ON_WM_ERASEBKGND() ON_COMMAND(ID_PLATE_PRE, OnPreProcess) ON_COMMAND(ID_VIEW_INTENSITY, OnViewIntensity) ON_COMMAND(ID_PLATE_TOGRAY, OnPlateToGray) ON_COMMAND(ID_PLATE_EQUA, OnPlateEqua) ON_COMMAND(ID_PLATE_ROBERT, OnPlateRobert) ON_COMMAND(ID_PLATE_LOCATE, OnPlateLocate) ON_COMMAND(ID_PLATE_CUT, OnPlateCut) ON_COMMAND(ID_BUTTON_TOGRAY, OnPlateToGray) ON_COMMAND(ID_BUTTON_EQUA, OnPlateEqua) ON_COMMAND(ID_BUTTON_ROBERT, OnPlateRobert) ON_COMMAND(ID_BUTTON_PRE, OnPreProcess) ON_COMMAND(ID_BUTTON_LOCATE, OnPlateLocate) ON_COMMAND(ID_BUTTON_CUT, OnPlateCut) ON_COMMAND(ID_PLATE_FILTER, OnPlateFilter) ON_COMMAND(ID_BUTTON_FILTER, OnPlateFilter) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView construction/destruction CPlateLocateView::CPlateLocateView() { // TODO: add construction code here m_ipzLeft=0; m_ipzRight=0; m_ipzBottom=0; m_ipzTop=0; } CPlateLocateView::~CPlateLocateView() { } BOOL CPlateLocateView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView drawing void CPlateLocateView::OnDraw(CDC* pDC) { // 显示等待光标 BeginWaitCursor(); // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // 获取DIB HDIB hDIB = pDoc->GetHDIB(); // 判断DIB是否为空 if (hDIB != NULL) { LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 获取DIB宽度 int cxDIB = (int) ::DIBWidth(lpDIB); // 获取DIB高度 int cyDIB = (int) ::DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL) hDIB); CRect rcDIB; rcDIB.top = rcDIB.left = 0; rcDIB.right = cxDIB; rcDIB.bottom = cyDIB; CRect rcDest; // 判断是否是打印 if (pDC->IsPrinting()) { // 是打印,计算输出图像的位置和大小,以便符合页面 // 获取打印页面的水平宽度(象素) int cxPage = pDC->GetDeviceCaps(HORZRES); // 获取打印页面的垂直高度(象素) int cyPage = pDC->GetDeviceCaps(VERTRES); // 获取打印机每英寸象素数 int cxInch = pDC->GetDeviceCaps(LOGPIXELSX); int cyInch = pDC->GetDeviceCaps(LOGPIXELSY); // 计算打印图像大小(缩放,根据页面宽度调整图像大小) rcDest.top = rcDest.left = 0; rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) / ((double)cxDIB * cxInch)); rcDest.right = cxPage; // 计算打印图像位置(垂直居中) int temp = cyPage - (rcDest.bottom - rcDest.top); rcDest.bottom += temp/2; rcDest.top += temp/2; } else // 非打印 { // 不必缩放图像 rcDest = rcDIB; } // 输出DIB ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), &rcDIB, pDoc->GetDocPalette()); } // 恢复正常光标 EndWaitCursor(); } ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView printing BOOL CPlateLocateView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CPlateLocateView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CPlateLocateView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView diagnostics #ifdef _DEBUG void CPlateLocateView::AssertValid() const { CView::AssertValid(); } void CPlateLocateView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CPlateLocateDoc* CPlateLocateView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPlateLocateDoc))); return (CPlateLocateDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPlateLocateView message handlers LRESULT CPlateLocateView::OnDoRealize(WPARAM wParam, LPARAM) { ASSERT(wParam != NULL); // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 判断DIB是否为空 if (pDoc->GetHDIB() == NULL) { // 直接返回 return 0L; } // 获取Palette CPalette* pPal = pDoc->GetDocPalette(); if (pPal != NULL) { // 获取MainFrame CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CClientDC appDC(pAppFrame); // All views but one should be a background palette. // wParam contains a handle to the active view, so the SelectPalette // bForceBackground flag is FALSE only if wParam == m_hWnd (this view) CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd); if (oldPalette != NULL) { UINT nColorsChanged = appDC.RealizePalette(); if (nColorsChanged > 0) pDoc->UpdateAllViews(NULL); appDC.SelectPalette(oldPalette, TRUE); } else { TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n"); } } return 0L; } BOOL CPlateLocateView::OnEraseBkgnd(CDC* pDC) { // 主要是为了设置子窗体默认的背景色 // 背景色由文档成员变量m_refColorBKG指定 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 创建一个Brush CBrush brush(pDoc->m_refColorBKG); // 保存以前的Brush CBrush* pOldBrush = pDC->SelectObject(&brush); // 获取重绘区域 CRect rectClip; pDC->GetClipBox(&rectClip); // 重绘 pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY); // 恢复以前的Brush pDC->SelectObject(pOldBrush); // 返回 return TRUE; //return CView::OnEraseBkgnd(pDC); } void CPlateLocateView::OnViewIntensity() { // 查看当前图像灰度直方图 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 创建对话框 CDlgIntensity dlgPara; // 初始化变量值 dlgPara.m_lpDIBBits = lpDIBBits; dlgPara.m_lWidth = ::DIBWidth(lpDIB); dlgPara.m_lHeight = ::DIBHeight(lpDIB); dlgPara.m_iLowGray = 0; dlgPara.m_iUpGray = 255; // 显示对话框,提示用户设定平移量 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); } void CPlateLocateView::OnTempSubrect() { CPlateLocateDoc* pDoc = GetDocument(); HDIB hDIB,hNewDIB; hDIB=pDoc->GetHDIB(); long lWidth; //图像宽度和高度 long lHeight; // 指向DIB的指针 LPSTR lpDIB; lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 // 找到DIB图像象素起始位置 lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 //假定的剪裁区域(车牌附近) // CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom); // CRect rect(m_ipzLeft,190,m_ipzRight,240); //CRect rect(0,190,lWidth,260); // CRect rect(0,m_ipzTop,lWidth,m_ipzBottom); hNewDIB= myCropDIB(hDIB,rect); if (OpenClipboard()) { EmptyClipboard(); SetClipboardData (CF_DIB, CopyHandle((HANDLE) hNewDIB )); CloseClipboard(); } } void CPlateLocateView::OnPlateToGray() { CPlateLocateDoc* pDoc = GetDocument(); //获取文档 LPSTR lpDIB; //指向DIB的指针 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); ConvertToGrayScale(lpDIB); OnEditCopy(); ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); } void CPlateLocateView::OnPlateEqua() { // 灰度均衡 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); } void CPlateLocateView::OnPlateRobert() { //Robert边缘检测运算 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的边缘检测,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的运算!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 调用RobertDIB()函数对DIB进行边缘检测 if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); } void CPlateLocateView::OnThresholdTrans() { CPlateLocateDoc* pDoc=GetDocument(); //获得文档 LPSTR lpDIB; //指向DIB的指针 LPSTR lpDIBBits; //指向DIB的象素的指针 LONG lLineBytes; unsigned char * lpSrc; //指向原图像象素点的指针 long lWidth; //图像宽度和高度 long lHeight; long i,j; //循环变量 OnEditCopy(); lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); long lCount[256]; for(i=0;i<256;i++) { lCount[i]=0; //清零 } if(::DIBNumColors(lpDIB) != 256) //256色位图不作任何处理 { return; } for(i=0;i<lHeight;i++) { for(j=0;j<lWidth;j++) { lpSrc=(unsigned char *)lpDIB+lLineBytes*i+j; lCount[*(lpSrc)]++; } } /*// 灰度均衡 // 获取文档 //CTypeRecDoc* pDoc = GetDocument(); // 指向DIB的指针 // LPSTR lpDIB; // 指向DIB象素指针 //LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();*/ long total = 0; long total1 = 0; for(i = 0;i < 256;i++) { total += lCount[i]; } int aver = total / 256; int mostClosed = 0; for(i = 0;i < 256;i++) { if((abs(aver - lCount[i]) < abs(aver - lCount[mostClosed]))) { mostClosed = i; } } for(i = 0;i < 100; i++) { total1 += lCount[i]; } //求窗口变换的上限和下限 // long temp[16]; int k=0; for(k=0;k<16;k++) { temp[k]=0; for(i=k*16;i<(k+1)*16;i++) temp[k]+=lCount[i]; } long max=0; int t=0; for(k=15;k>=0;k--) { if(temp[k]>max) { max=temp[k]; t=k; } } int bLow=0,bUp=0; bLow=(t-1)*16; // bUp=(t+5)*16; // bLow=100; bUp=255; // 阈值 INT bThre; bThre=(INT)((2*bUp+bLow)/3); if(double(total1) / total > 0.2)//图片比较亮 bThre = 200; if(double(total1) / total > 0.25) bThre = 160; if(double(total1) / total > 0.3) bThre = 150; if(double(total1) / total > 0.34) bThre = 130; if(double(total1) / total > 0.38) bThre = 110; if(double(total1) / total > 0.4) bThre = 100; if(double(total1) / total > 0.5) bThre = 90; if(double(total1) / total > 0.6)//图片比较黑 bThre = 80; // 更改光标形状 BeginWaitCursor(); // 调用ThresholdTrans()函数进行阈值变换 ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 100); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); } //(2)削弱背景干扰。对图像B作简单的相邻像素灰度值相减,得到新的图像G, //即Gi,j=|Pi,j-Pi,j-1|i=0,1,…,439;j=0,1,…,639Gi,0=Pi,0,左边缘直接赋值, //不会影响整体效果。 // void CPlateLocateView::OnWeakenBkgInerfere() { CPlateLocateDoc* pDoc=GetDocument(); //获得文档 LPSTR lpDIB; //指向DIB的指针 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 //用自定义的模板消弱背景干扰 myTemplate(lpDIB); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); } void CPlateLocateView::OnMidFilter() { // 中值滤波 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 滤波器的高度 int iFilterH; // 滤波器的宽度 int iFilterW; // 中心元素的X坐标 int iFilterMX; // 中心元素的Y坐标 int iFilterMY; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的中值滤波!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 创建对话框 // 初始化变量值 iFilterH = 5; iFilterW = 1; iFilterMX = 0; iFilterMY = 2; // 更改光标形状 BeginWaitCursor(); // 调用MedianFilter()函数中值滤波 if (myMedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), iFilterH, iFilterW, iFilterMX, iFilterMY)) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); } void CPlateLocateView::OnFindPlate() { CPlateLocateDoc* pDoc=GetDocument(); //获得文档 LPSTR lpDIB; //指向DIB的指针 long lWidth; //图像宽度和高度 long lHeight; lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 //水平投影,求取车牌子图像的上下边缘位置 // myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ; m_ipzLeft=0; m_ipzRight=lWidth; HDIB hDIB; HDIB hNewDIB; hDIB=pDoc->GetHDIB(); //假定的剪裁区域(车牌附近) // CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom); hNewDIB= myCropDIB(hDIB,rect); // 判断是否剪裁成功 if (hNewDIB != NULL) { // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 替换DIB,同时释放旧DIB对象 pDoc->ReplaceHDIB(hNewDIB); // 更新DIB大小和调色板 pDoc->InitDIBData(); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 实现新的调色板 OnDoRealize((WPARAM)m_hWnd,0); } //5 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight =::DIBHeight(lpDIB); //DIB 高度 myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight) ; pDoc->UpdateAllViews(NULL); ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); } void CPlateLocateView::OnEditCopy() { // 复制当前图像 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 清空剪贴板 EmptyClipboard(); // 复制当前图像到剪贴板 SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) ); // 关闭剪贴板 CloseClipboard(); // 恢复光标 EndWaitCursor(); } } void CPlateLocateView::OnEditPaste() { // 粘贴图像 // 创建新DIB HDIB hNewDIB = NULL; // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 读取剪贴板中的图像 hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); // 关闭剪贴板 CloseClipboard(); // 判断是否读取成功 if (hNewDIB != NULL) { // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 替换DIB,同时释放旧DIB对象 pDoc->ReplaceHDIB(hNewDIB); // 更新DIB大小和调色板 pDoc->InitDIBData(); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 重新设置滚动视图大小 // SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 实现新的调色板 OnDoRealize((WPARAM)m_hWnd,0); // 更新视图 pDoc->UpdateAllViews(NULL); } // 恢复光标 EndWaitCursor(); } } void CPlateLocateView::OnPreProcess() { OnEditPaste(); OnThresholdTrans(); OnWeakenBkgInerfere(); } void CPlateLocateView::OnPlateLocate() { OnFindRightAngle(); } void CPlateLocateView::OnPlateCut() { OnEditPaste(); OnTempSubrect(); OnEditPaste(); } void CPlateLocateView::OnFindRightAngle() { CPlateLocateDoc* pDoc=GetDocument(); //获得文档 LPSTR lpDIB; //指向DIB的指针 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 CDC* pDC = GetDC(); myFindRightAngle(pDC,lpDIB,&m_ipzLeft,&m_ipzTop,&m_ipzRight,&m_ipzBottom); DrawRectangle(pDC,m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom); } void CPlateLocateView::OnPlateFilter() { CPlateLocateDoc* pDoc=GetDocument(); //获得文档 LPSTR lpDIB; //指向DIB的指针 LPSTR lpDIBBits; //指向DIB的象素的指针 LONG lLineBytes; //unsigned char * lpSrc; //指向原图像象素点的指针 long lWidth; //图像宽度和高度 long lHeight; lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图 // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 更改光标形状 BeginWaitCursor(); // 调用ThresholdTrans()函数进行阈值变换 ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 128); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }